#ifndef __SYLAR_FD_MANAGER_H__
#define __SYLAR_FD_MANAGER_H__

#include <memory>
#include <vector>
#include "thread.h"
#include "singleton.h"

namespace sylar{

/**
 * @brief 对文件上下文的封装
 */
class FdCtx : public std::enable_shared_from_this<FdCtx>{
public:
	typedef std::shared_ptr<FdCtx> ptr;
	FdCtx(int fd);
	~FdCtx();
	/**
	 * @brief 初始化文件上下文
	 */
	bool init();
	
	bool isInit() const {return m_isInit;}
	bool isSocket() const {return m_isSocket;}
	bool isClose() const {return m_isClosed;}

	void setUserNonblock(bool v) {m_userNonblock = v;};
	bool getUserNonblock() const {return m_userNonblock;};
	
	void setSysNonblock(bool v) {m_sysNonblock = v;}
	bool getSysNonblock() const {return m_sysNonblock;}

	void setTimeout(int type, uint64_t v);
	uint64_t getTimeout(int type);

private:
	bool m_isInit: 1;		//是否已经初始化
	bool m_isSocket: 1;		//是否是套接字文件
	bool m_sysNonblock: 1;	//是否设置为系统非阻塞
	bool m_userNonblock: 1;	//是否设置为用户非阻塞
	bool m_isClosed: 1;		//是否是关闭状态
	int m_fd;				//linux分配的的文件描述符
	uint64_t m_recvTimeout;	//接收信息超时时间
	uint64_t m_sendTimeout;	//发送信息超时时间
};

class FdManager{
public:
	typedef RWMutex RWMutexType;
	FdManager();
	/**
	 * @brief 根据fd获取文件上下文信息
	 */
	FdCtx::ptr get(int fd, bool auto_create = false);
	/**
	 * @brief 删除文件 清空m_datas所指向的该文件的指针
	 */
	void del(int fd);	
private:
	RWMutexType m_mutex;
	std::vector<FdCtx::ptr> m_datas;
};

typedef Singleton<FdManager> FdMgr;

}

#endif